﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Clinica_Frba
{
    public partial class Rol : Form
    {
        public const char Alta = 'A';
        public const char Baja = 'B';
        public const char Edit = 'E';
        public const char Display = 'D';
        private Conexion sqlCon = Conexion.getInstance();
        public char accion;
        public int idRol;
        public string nom;
        bool rolHabilitado = true;

        public Rol()
        {
            InitializeComponent();
        }

        private void Rol_Load(object sender, EventArgs e)
        {
            if (accion == Rol.Display)
            {
                nombreRol.Text = nom;
                nombreRol.ReadOnly = true;
                grabar.Visible = false;
                limpiar.Visible = false;
                label2.Text = "Funcionalidades";
            }
            else if (accion == Rol.Alta)
            {
                this.Text = "Alta de Rol";
            }
            else if (accion == Rol.Edit)
            {
                this.Text = "Modificar Rol";
                nombreRol.Text = nom;
                checkHabilitado();
            }

            fillGridListFunc();
        }

        private void checkHabilitado()
        {
            SqlDataReader reader;

            reader = sqlCon.execQuery("SELECT Habilitado FROM b_sharp.Rol WHERE id_Rol = "+idRol+";");

            if (reader.Read())
                if (reader.GetString(0) == "N")
                {
                    labelHabilitado.Visible = true;
                    buttonHabilitar.Visible = true;
                    nombreRol.ReadOnly = true;
                    grabar.Visible = false;
                    limpiar.Visible = false;
                    label2.Text = "Funcionalidades";
                    rolHabilitado = false;
                }
        }

        private void fillGridListFunc() 
        {
            SqlDataAdapter adapter;
            DataTable table;
            string query;

            if (accion != Rol.Display && rolHabilitado)
                query = "SELECT id_Funcionalidad, Nombre " +
                        " FROM b_sharp.Funcionalidad;";
            else
                query = "SELECT fun.id_Funcionalidad, fun.Nombre " +
                        " FROM b_sharp.Funcionalidad fun JOIN b_sharp.Rol_Funcionalidad rf " +
                        " ON fun.id_Funcionalidad = rf.id_Funcionalidad WHERE id_Rol = " + idRol + ";";


            adapter = sqlCon.execQueryGrid(query);
            table = new DataTable();
            adapter.Fill(table);

            dGridVListFunc.DataSource = table;
            dGridVListFunc.Columns["id_Funcionalidad"].Visible = false;
            dGridVListFunc.Columns["Nombre"].Width = 250;
            dGridVListFunc.Columns["Nombre"].ReadOnly = true;

            if (accion == Rol.Display || !rolHabilitado)
                dGridVListFunc.Columns["Seleccionado"].Visible = false;

            else if (accion == Rol.Edit)
                marcarFuncionalidades();
        }

        private void marcarFuncionalidades()
        {
            SqlDataReader reader;

            reader = sqlCon.execQuery("SELECT fun.id_Funcionalidad " +
                                      " FROM b_sharp.Funcionalidad fun JOIN b_sharp.Rol_Funcionalidad rf " +
                                      " ON fun.id_Funcionalidad = rf.id_Funcionalidad WHERE id_Rol = " + idRol + ";");
            while (reader.Read())
            {
                foreach (DataGridViewRow row in dGridVListFunc.Rows)
                {
                    if ((int)row.Cells["id_Funcionalidad"].Value == reader.GetInt32(0))
                    {
                        ((DataGridViewCheckBoxCell)row.Cells["Seleccionado"]).Value = true;
                        break;
                    }
                }   
            }
        }

        private void grabar_Click(object sender, EventArgs e)
        {
            List<int> rowsList = new List<int>();

            try
            {
                if (nombreRol.Text.Length == 0)
                {
                    MessageBox.Show("Complete el nombre del Rol");
                    return;
                }

                foreach (DataGridViewRow row in dGridVListFunc.Rows)
                {
                    DataGridViewCheckBoxCell check = (DataGridViewCheckBoxCell)row.Cells["Seleccionado"];

                    if ((check.Value != null) && (bool)check.Value)
                        rowsList.Add(row.Index);
                }

                if (rowsList.Count == 0)
                {
                    MessageBox.Show("Seleccione al menos una funcionalidad");
                    return;
                }

                if (accion == Rol.Alta)
                    insertRol(rowsList);

                if (accion == Rol.Edit)
                    updateRol(rowsList);
                
                this.Close();
            }
            catch (Exception)
            {
                MessageBox.Show("Error al intentar grabar los datos, intente nuevamente");
            }

        }

        private void insertRol(List<int> rowsList)
        {
            int id_Rol = 0;
            SqlCommand command;

            command = new SqlCommand("INSERT INTO b_sharp.Rol (Nombre,Habilitado) VALUES (@Nombre,'S');SELECT CAST(SCOPE_IDENTITY() AS int);", sqlCon.openCon());
            command.Parameters.AddWithValue("@Nombre", nombreRol.Text);

            id_Rol = (Int32)command.ExecuteScalar();

            insertFuncionalidades(rowsList, id_Rol);

            MessageBox.Show("Rol " + nombreRol.Text + " creado satisfactoriamente");
        }

        private void insertFuncionalidades(List<int> rowsList, int id_Rol)
        {
            int idFunc = 0;
            SqlCommand command;

            foreach (int rowIndex in rowsList)
            {
                idFunc = Convert.ToInt32(dGridVListFunc.Rows[rowIndex].Cells["id_Funcionalidad"].Value);

                command = new SqlCommand("INSERT INTO b_sharp.Rol_Funcionalidad (id_Rol, id_Funcionalidad) VALUES (@idRol,@idFunc);", sqlCon.openCon());
                command.Parameters.AddWithValue("@idRol", id_Rol);
                command.Parameters.AddWithValue("@idFunc", idFunc);

                command.ExecuteNonQuery();
            }
        }

        private void updateRol(List<int> rowsList)
        {
            string update;
            SqlCommand command;

            //Eliminamos entradas viejas
            update = "DELETE b_sharp.Rol_Funcionalidad WHERE id_rol = @idRol; ";

            //Actualizamos nombre de rol
            update += "UPDATE b_sharp.Rol SET Nombre = @name WHERE id_Rol = @idRol; ";

            command = new SqlCommand(update,sqlCon.openCon());
            command.Parameters.AddWithValue("@idRol",idRol);
            command.Parameters.AddWithValue("@name",nombreRol.Text);
            command.ExecuteNonQuery();

            //Insertamos entradas nuevas
            insertFuncionalidades(rowsList, idRol);

            MessageBox.Show("Datos grabados correctamente");
        }

        private void limpiar_Click(object sender, EventArgs e)
        {
            //Limpiar nombre de rol
            nombreRol.Text = "";

            //Limpiar funcionalidades seleccionadas
            foreach (DataGridViewRow row in dGridVListFunc.Rows)
            {
                DataGridViewCheckBoxCell check = (DataGridViewCheckBoxCell)row.Cells["Seleccionado"];

                if ((check.Value != null) && (bool)check.Value)
                    check.Value = false;
            }
        }

        private void buttonHabilitar_Click(object sender, EventArgs e)
        {
            SqlCommand command = new SqlCommand("UPDATE b_sharp.Rol SET Habilitado = 'S' WHERE id_Rol = @idRol;", sqlCon.openCon());
            command.Parameters.AddWithValue("@idRol",idRol);
            command.ExecuteNonQuery();
            MessageBox.Show("Rol Habilitado exitosamente");

            //Recargar el Form de rol pero en modo de edicion
            Rol modRol = new Rol();
            modRol.idRol = this.idRol;
            modRol.nom = this.nom;
            modRol.accion = Rol.Edit;

            //Ocultar Form actual
            this.Hide();

            //Abrir nuevo
            modRol.Focus();
            modRol.ShowDialog();

            //Cerrar form
            this.Close();
        }

    }
}
